package psn.polaris.db.init;

import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.stereotype.Component;
import psn.polaris.db.config.PolarisDataSourceDataInfo;

import javax.sql.DataSource;

@Configuration
@Component
public abstract class AbsDataSourceInitProcess<T extends DataSource> {

    private PolarisDataSourceDataInfo dataInfo;


    /**
     * 创建数据源（子类增加 @Bean 和 @Scope 注解）
     * @return  数据源
     * @throws RuntimeException 异常信息
     */
    @Scope("prototype")
    public abstract T getDataSource() throws RuntimeException;

    /**
     * 事务管理注册（子类增加 @Bean 和 @Scope 注解）
     * @param dataSource    数据源对象
     * @return              事务管理器
     * @throws RuntimeException 异常信息
     */
    @Scope("prototype")
    public abstract DataSourceTransactionManager transactionManager(T dataSource) throws RuntimeException;

    /**
     * 创建事务管理器实际方法
     * @param dataSource            数据源
     * @return                      事务管理器
     * @throws RuntimeException     异常信息
     */
    protected DataSourceTransactionManager buildTransactionMananger(T dataSource) throws RuntimeException{
        return new DataSourceTransactionManager(dataSource);
    }

    public PolarisDataSourceDataInfo getDataInfo() {
        return dataInfo;
    }

    public void setDataInfo(PolarisDataSourceDataInfo dataInfo) {
        this.dataInfo = dataInfo;
    }

}
